`
https://leetcode.cn/problems/24-game/
`

/**
 * @param {number[]} cards
 * @return {boolean}
 */
var judgePoint24 = function (cards) {
  const EPSILON = 1e-6;

  function solve(nums) {
    // 只有一个数字就是结果，判断是否等于 24
    if (nums.length === 1) {
      return Math.abs(nums[0] - 24) < EPSILON;
    }

    // 选择两个数字进行运算
    for (let i = 0; i < nums.length; i++) {
      for (let j = 0; j < nums.length; j++) {
        // 避免重复选择同一个数字
        if (i === j) continue;

        const remaining = [];
        for (let k = 0; k < nums.length; k++) {
          // 避免选择已经选择的数字
          if (k !== i && k !== j) {
            remaining.push(nums[k]);
          }
        }

        for (let op = 0; op < 4; op++) {
          if (op < 2 && i > j) continue; // 加法和乘法满足交换律，避免重复计算
          let res;
          if (op === 0) {
            res = nums[i] + nums[j];
          } else if (op === 1) {
            res = nums[i] * nums[j];
          } else if (op === 2) {
            res = nums[i] - nums[j];
          } else if (op === 3) {
            // 除法时，除数不能为 0
            if (Math.abs(nums[j]) < EPSILON) continue;
            res = nums[i] / nums[j];
          }
          // 得到结果，作为新的数字，继续递归
          remaining.push(res);
          if (solve(remaining)) {
            return true;
          }
          // 撤销选择
          remaining.pop();
        }
      }
    }
    return false;
  }

  return solve(cards);
};

